// package com.xuyuan.jdk;
//
// import com.sun.management.HotSpotDiagnosticMXBean;
// import jdk.management.cmm.SystemResourcePressureMXBean;
// import org.junit.jupiter.api.Test;
// import sun.management.*;
//
// import java.lang.management.ManagementFactory;
// import java.lang.management.*;
// import java.util.Date;
// import java.util.List;
// import java.util.Set;
//
// /**
//  * <p> ManagementFactory 类是用于获取 Java 平台的托管 bean 的工厂类。此类由静态方法组成，每个方法都返回一个或多个平台 MXBean，这些 MXBean 表示 Java 虚拟机组件的管理接口。
//  * <p>比如Runtime的MXBean - RuntimeMXBean，可以获取虚拟机中的运行时信息，比如JVM的版本，内存信息，线程信息等。
//  * <p>{@link PlatformManagedObject }：所有托管 bean 的超类。
//  * <p>{@link RuntimeMXBean }：获取 JVM 运行时信息。
//  * <p>{@link MemoryMXBean }：获取 JVM 内存信息。
//  * <p>{@link ThreadMXBean }：获取 JVM 线程信息。
//  * <p>{@link OperatingSystemMXBean }：获取操作系统信息。
//  * <p>{@link ClassLoadingMXBean }：获取类加载信息。
//  * <p>{@link GarbageCollectorMXBean }：获取垃圾收集器信息。
//  * <p>{@link CompilationMXBean }：获取 JIT 编译器信息。
//  * <p>{@link SystemResourcePressureMXBean } : 获取系统资源压力信息。
//  * <p>{@link HotSpotDiagnosticMXBean }: 用于获取JVM的Dump信息。
//  * <p>
//  * <p>HotSpot JVM 提供更加强大的MBean
//  * <p>{@link HotspotRuntimeMBean }
//  * <p>{@link HotspotMemoryMBean }
//  * <p>{@link HotspotThreadMBean }
//  * <p>{@link HotspotInternalMBean }
//  * <p>{@link HotspotClassLoadingMBean }
//  *
//  * @author xuyuan
//  * @see java.lang.management.ManagementFactory 实际通过ManagementFactoryHelper
//  * @see ManagementFactoryHelper 通过其获取MXBean
//  * @see javax.management.MBeanServer 获取平台托管Bean的Server
//  */
// public class JdkManagementFactory {
//
//     /**
//      * 获取平台托管Bean的代理Bean，通过代理Bean实现对应Bean的功能。
//      * 也可以通过获取托管Bean对象的Server，通过Server实现对应Bean的功能。
//      *
//      * @throws Exception
//      */
//     @Test
//     public void test() throws Exception {
//         Set<Class<? extends PlatformManagedObject>> platformManagementInterfaces = ManagementFactory.getPlatformManagementInterfaces();
//         System.out.println(platformManagementInterfaces);
//     }
//
//     @Test
//     public void test2() {
//         // 获取运行时信息
//         RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
//         System.out.println("JVM启动时间: " + new Date(runtime.getStartTime()));
//         System.out.println("JVM运行时间: " + runtime.getUptime() + " 毫秒");
//         System.out.println("JVM名称: " + runtime.getVmName());
//         System.out.println("JVM版本: " + runtime.getVmVersion());
//         System.out.println("JVM供应商: " + runtime.getVmVendor());
//
//         // 获取内存信息
//         MemoryMXBean memory = ManagementFactory.getMemoryMXBean();
//         MemoryUsage heapMemoryUsage = memory.getHeapMemoryUsage();
//         MemoryUsage nonHeapMemoryUsage = memory.getNonHeapMemoryUsage();
//         System.out.println("堆内存初始大小: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB");
//         System.out.println("堆内存最大大小: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB");
//         System.out.println("堆内存已用大小: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB");
//         System.out.println("堆内存提交大小: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");
//         System.out.println("非堆内存初始大小: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB");
//         System.out.println("非堆内存最大大小: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB");
//         System.out.println("非堆内存已用大小: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB");
//         System.out.println("非堆内存提交大小: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");
//
//         // 获取线程信息
//         ThreadMXBean thread = ManagementFactory.getThreadMXBean();
//         System.out.println("当前活动线程数: " + thread.getThreadCount());
//         System.out.println("峰值线程数: " + thread.getPeakThreadCount());
//         System.out.println("守护线程数: " + thread.getDaemonThreadCount());
//         long[] deadlockedThreads = thread.findDeadlockedThreads();
//         if (deadlockedThreads != null) {
//             System.out.println("死锁线程: " + deadlockedThreads.length);
//         } else {
//             System.out.println("没有死锁线程");
//         }
//
//         // 获取操作系统信息
//         OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
//         System.out.println("操作系统名称: " + os.getName());
//         System.out.println("操作系统版本: " + os.getVersion());
//         System.out.println("操作系统架构: " + os.getArch());
//         System.out.println("可用处理器数量: " + os.getAvailableProcessors());
//
//         // 获取类加载信息
//         ClassLoadingMXBean classLoading = ManagementFactory.getClassLoadingMXBean();
//         System.out.println("已加载的类的数量: " + classLoading.getLoadedClassCount());
//         System.out.println("总共加载的类的数量: " + classLoading.getTotalLoadedClassCount());
//         System.out.println("卸载的类的数量: " + classLoading.getUnloadedClassCount());
//
//         // 获取垃圾收集器信息
//         List<GarbageCollectorMXBean> gcBeans = ManagementFactory.getGarbageCollectorMXBeans();
//         for (GarbageCollectorMXBean gcBean : gcBeans) {
//             System.out.println("垃圾收集器名称: " + gcBean.getName());
//             System.out.println("垃圾收集次数: " + gcBean.getCollectionCount());
//             System.out.println("垃圾收集时间: " + gcBean.getCollectionTime() + " 毫秒");
//         }
//
//         // 获取JIT编译器信息
//         CompilationMXBean compilation = ManagementFactory.getCompilationMXBean();
//         System.out.println("编译器名称: " + compilation.getName());
//         System.out.println("编译时间: " + compilation.getTotalCompilationTime() + " 毫秒");
//
//     }
//
//
//     @Test
//     public void test3() {
//         try {
//             HotSpotDiagnosticMXBean hotSpotDiagnosticMXBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
//             // 方法2 HotSpotDiagnosticMXBean hotSpotDiagnostic = ManagementFactory.newPlatformMXBeanProxy(ManagementFactory.getPlatformMBeanServer(), "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
//             // 导出堆转储文件
//             String dumpFilePath = "C:/Users/64606/Desktop/heapdump.hprof";
//             boolean live = true; // 只导出活动对象
//             hotSpotDiagnosticMXBean.dumpHeap(dumpFilePath, live);
//             System.out.println("堆转储文件已导出到: " + dumpFilePath);
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
// }
